/*
 * ComponenteDistribuidorGeneradorClase.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 2/03/2011, 05:33:18 PM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.old.ComponenteBeans;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.CustomObjetoReflexion;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;

/**
 * <i><b>ComponenteDistribuidorGeneradorClase:</b></i><p>Esta clase es la base para las
 * representaciones de las clases del modelo anallizado.</p>
 * <p>En el Contexto de la Aplicación una Clase del Modelo analizado puede ser
 * representada por diversas formas ya sea para operaciones de salida visualizando
 * unos o varios métodos ó para operaciones de entrada por medio de propiedades
 * ó constructores.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 2/03/2011
 * @see ComponenteDistribuidorGenerador 
 */
public abstract class ComponenteDistribuidorGeneradorClase extends ComponenteDistribuidorGenerador{
    private static final long serialVersionUID = -7376631559010990573L;
    
    private int idClaseComponenteGeneradorClase;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradorClase;
    /**
     * Indica el Modo de Representación Personalizada.
     */
    protected int customRepresentacion = CustomObjetoReflexion.REPRESENTACION_NINGUNA;

    /** 
     * Constructor por Defecto.      
     * @param objComponenteBase Componente Base para la Representación.     
     * @param strClassPathTipoDato Definición del Tipo de Dato que representa la Clase del Modelo analizado.
     * @param heredado Indica si el Objeto es heredado.
     * @param previsualizar  Indica si el Objeto soportará visualizaciones.
     */
    public ComponenteDistribuidorGeneradorClase(ComponenteBaseStandar objComponenteBase, String strClassPathTipoDato, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, strClassPathTipoDato, true, true);  
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.generador.clase");  
        if(!heredado){
            this.idClaseComponenteGeneradorClase = (!previsualizar) ?
                    ComponenteDistribuidorGeneradorClase.serialIdComponenteGeneradorClase++ :
                    ComponenteDistribuidorGeneradorClase.serialIdComponenteGeneradorClase;
        }
        Class<?> objClass;
        try {
            objClass = Class.forName(strClassPathTipoDato);
            this.strSimpleClassPathTipoDato = objClass.getSimpleName();
        } catch (ClassNotFoundException ex) {
            //Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
            if(strClassPathTipoDato.length() >= 2){
                int i = strClassPathTipoDato.lastIndexOf(".");
                this.strSimpleClassPathTipoDato = 
                        String.valueOf(Character.toUpperCase(strClassPathTipoDato.charAt(i + 1))) + 
                        strClassPathTipoDato.substring(i + 2);        
            }
        }
    }
    
    /**
     * Devuelve el id de creación del Componente. No se debe confundir con el #getId()
     * @return id de creación del Componente.
     */
    public int getIdClaseComponenteGeneradorClase() {
        return idClaseComponenteGeneradorClase;
    }    
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClase.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
   
    public Componente buscarComponente(String strName){
        try{            
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            objComponente = this.buscarComponenteGenerado(strName);
            if(objComponente != null){
                return objComponente;
            }
        }catch(java.lang.NullPointerException ex){            
        }
        return null;
    }    
    
    @Override    
    public String toString() {
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + this.dni + this.idClaseComponenteGeneradorClase;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + this.dni + this.idClaseComponenteGeneradorClase;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + this.dni + this.idClaseComponenteGeneradorClase;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteGeneradorClase;
    }   
    
    @Override
    public int compareTo(Object o) {
        if(o instanceof ComponenteDistribuidorIntegrador){
            return 1;
        }
        else if(o instanceof ComponenteDistribuidorGeneradorVinculador ||                
                o instanceof ComponenteDistribuidorGeneradorUnitario ||
                o instanceof ComponenteDistribuidorGeneradorString ||
                o instanceof ComponenteDistribuidorGeneradorEnum){
            return -1;
        }
        else{
            ComponenteDistribuidorGeneradorClase obj = (ComponenteDistribuidorGeneradorClase) o;        
            return this.objTipoDato.getStrClassPath().compareToIgnoreCase(obj.getObjTipoDato().getStrClassPath());            
        }
    }          
        
    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradorClase = ComponenteDistribuidorGeneradorClase.serialIdComponenteGeneradorClase++;
            this.previsualizar = false;
        }
    }    

    public void importId(int id){
        ComponenteDistribuidorGeneradorClase.serialIdComponenteGeneradorClase = ++id;
        this.idClaseComponenteGeneradorClase = ComponenteDistribuidorGeneradorClase.serialIdComponenteGeneradorClase++;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorGeneradorClase){
            ComponenteDistribuidorGeneradorClase objComponente = (ComponenteDistribuidorGeneradorClase) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 89 * hash + this.idClaseComponenteGeneradorClase;
        return hash;
    }
    
    /**
     * Devuelve el modo de Representación.
     * @return modo de Representación.
     */
    public int getCustomRepresentacion() {
        return customRepresentacion;
    }

    /**
     * Establece el modo de Representación.
     * @param customRepresentacion modo de Representación.
     */
    public void setCustomRepresentacion(int customRepresentacion) {
        this.customRepresentacion = customRepresentacion;
    }

    public ComponenteDistribuidor convertirEnComponenteLibre() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public ComponenteBeans generarRepresentacionBeans() {
        throw new UnsupportedOperationException("Not supported yet.");        
    }
}

